/**
 * \file	EnsembleCouples.h
 * \author	Thibaut ALGRIN
 * \author	Emmanuel CARRE
 * \version	0.1
 * \date	Décembre 2011
 */

#ifndef ENSEMBLECOUPLES_H_
#define ENSEMBLECOUPLES_H_

#include <iostream>
#include <set>
#include <map>

namespace tp3
{
	/*
	 * \class MapAdaptateur
	 * \brief Classe permettant de retrourner une liste d'element
	 * \fn EnsembleCouples<Type1, Type2>
	 */
	template<typename Type1, typename Type2>
	class EnsembleCouples
	{
	public:
		/*
		 * \brief Constructeur de la Classe EnsembleCouples
		 * \fn EnsembleCouples();
		 */
		EnsembleCouples();
		/*
		 * \brief Constructeur de la Classe EnsembleCouples
		 * \fn EnsembleCouples(Iterateur debut, Iterateur fin)
		 * \param Iterateur debut
		 * \param Iterateur fin
		 */
		template<typename Iterateur>
		EnsembleCouples(Iterateur debut, Iterateur fin);
		/*
		 * \brief Méthode permettant d'ajouter un std::pair à la liste
		 * \return void
		 * \param Type1 premier
		 * \param Type2 second
		 * \fn void ajouterPaire(Type1 premier, Type2 second)
		 */
		void ajouterPaire(Type1 premier, Type2 second);
		/*
		 * \brief Méthode pour savoir si la liste est vide
		 * \fn bool estVide() const
		 * \param void
		 * \return bool, true ou false
		 */
		bool estVide() const;
		/*
		 * \brief Surcharche de l'opèrateur ==
		 * \param  const EnsembleCouples& autreEns
		 * \return bool
		 * \fn bool operator==(const EnsembleCouples& autreEns) const
		 */
		bool operator==(const EnsembleCouples& autreEns) const;

		/*
		 * \brief Surcharge de l'operateur <<
		 * \post affiche sur la sortie standard
		 * \param std::ostream& os
		 * \param const EnsembleCouples<Type3, Type4>& ens
		 * \return std::ostream&
		 * \fn friend std::ostream& operator<<(std::ostream& os, const EnsembleCouples<Type3, Type4>& ens)
		 */
		template<typename Type3, typename Type4>
		friend std::ostream& operator<<(std::ostream& os, const EnsembleCouples<Type3, Type4>& ens)
		{
			os << "{";
			typename std::set<typename std::pair<Type3, Type4> >::const_iterator coupleCourant = ens.m_ensemble.begin();
			while(coupleCourant != ens.m_ensemble.end())
				{
					os << "(" << coupleCourant->first << "," << coupleCourant->second << ")";
					++coupleCourant;
					if (coupleCourant != ens.m_ensemble.end())
						{
							os << ";";
						}
				}
			os << "}" << std::endl;
			return os;
		}

	private:
		std::set<std::pair<Type1, Type2> > m_ensemble;
	};

}

#include "EnsembleCouples.inl"

#endif /* ENSEMBLECOUPLES_H_ */
